!2022.8.29責任更新: 因 heroku 已公告自2022.11月收費,可遷移至其他雲端服務, fly.io 實測可以達成,您可以將本系列文的程式轉移部署至 fly.io,教學請參閱我的HackMD。
為了在本機建立逐步建立您的 LINE Chat Bot , 並且透過 ngrok 讓您的 Flask 得以運作,本系列文在 Day 12 、 Day13、 Day 14 分3篇介紹,但透過 ngrok 要時常修改 Webhook 做測試時尚可,對於追求穩定的佈署環境並非適當,如果可以將程式放在雲端執行多好,接下來我們要佈署的伺服器為免費就夠用的 Heroku ,不只五星級而且有省錢。 Heroku 是個雲端伺服器,因為他的專案( Heroku 稱為 dyno) 可以產生具安全驗證的 https 網域, Python 等程式皆可運行,缺點是 30 分鐘不動他會休眠,每月至多醒 550 小時(有綁定信用卡可免費至多 1000 小時, dyno 合併計算),每次休眠喚醒需要約 30 秒時間,對 LINE 聊天機器人使用者而言稍嫌體驗不佳,後續會說明如何長期喚醒。當然如果你要換 AWS 或 GCP 也很不錯。
git --version
確認版本,如有顯示表示安裝完成。git config --global user.name "你的名字"
及 git config --global user.email "和你的信箱"
初始化你的 Git 環境。$ heroku -v
走到這一步你的聊天機器人可以真正走上雲端了!
在 Heroku 點選建立新的 app 。
賞個名子讓他獲得加護(大賢者:【告】,沒有這回事)。
檢視 Deply 各種指令,指令幾乎針對你的 dyno 所寫,只要依照需求執行即可,跟妹妹一樣貼心。
在 Heroku 的 setting 裡,在 "Add Buildpack" 選項中選擇 Python。
回到電腦本機,創一個準備跟heroku同步的資料夾。
在 CMD 輸入 heroku login
,依指引完成登入。
至本機資料夾完成 Git 版本控制初始化動作。本機資料夾在 Windows作業系統的話以cd 資料夾位址
切換,在資料夾內輸入git init
完成初始化。
增加3個必需的檔案, Procfile
、 rutime.txt
及 requirements.txt
:
在資料夾增加 Procfile
檔案(無須副檔名),告訴 Heroku 我們的應用程式是 web 類型的應用程式,以及需要執行的是 app 這個檔案,Procfile
的內容只需要一行 web: gunicorn app:app –preload
(!先前範例為web: gunicorn app_core:app –preload
,這會導致錯誤的結果,請配合更新)。
web: gunicorn app:app –preload
增加 rutime.txt
檔案,好讓 Heroku 知道你要用什麼程式執行。Python版本請見buildpack說明(3.8.2已不支援!)
python-3.8.12
增加 requirements.txt
檔案,好讓heroku這純白的伺服器也知道要外部加載什麼模組。版本號碼不知道可以在終端機以 pip list
指令查詢。
Flask==1.1.2
line-bot-sdk==1.16.0
gunicorn==20.0.4
最後,在資料夾下執行以下3個指令:
$ git add .
$ git commit -am "make it better"
$ git push heroku master
git add .
表示在此資料夾所有的異動,準備加入git版控。git commit -am "make it better"
表示留下對此版本的註解,方便日後溝通查閱。git push heroku master
表示要push變更內容到heroku伺服器的master主幹。如果出現remote: Verifying deploy... done.
就是成功啦,有紅字代表錯誤再試著排除喔。至 Heroku 檢查是否成功。
https://{你的dyno名稱}.herokuapp.com/
。https://{你的dyno名稱}.herokuapp.com/callback
。
https://{你的dyno名稱}.herokuapp.com/callback
Verify
要等 Heroku 回傳訊息,因 Heroku 會睡覺要大概 30 秒喚醒,加上第一次建立連線,再多嘗試幾次。
H14
碼,至 Heroku 錯誤代碼查詢意義為何。本篇開始將本機的程式佈署至雲端,讓您的聊天機器人如同線上的多媒體系統,可以在雲端無時無刻的提供服務。因 Heroku 免費且提供的服務網址具有 Https 憑證,不需要額外申請即可使用,讓串接需要 Https 的 LINE Message API 可以順利接獲訊息。之後我們會再完成讓 Heroku 更完整的設定,我們下篇見。
!2022.8.29責任更新: 因 heroku 已公告自2022.11月收費,可遷移至其他雲端服務, fly.io 實測可以達成,您可以將本系列文的程式轉移部署至 fly.io,教學請參閱我的HackMD。
想問一下照著筆者的步驟做,為何會出現下面的ERROR
剛測試還可以執行,推測您遇到的狀況:
推測原因主要是錯誤碼 503 是屬於伺服器端的問題,5XX 系列都是伺服器的狀況,如果無連線是 404 ,他能跟您反饋 503 表示伺服器有收到但有問題,很有可能是網址加上 callback 才會觸發回傳動作有關,您再試試看喔。
今日測試發現是因為runtime.txt
原為3.8.2,Heroku已不支援,查閱支援版本後您可更改為3.8.12,Python版本請見buildpack說明。
但具體而言您應該要查閱Heroku的logs確認問題所在,終端機也可以輸入heroku logs --tail
看異常狀況,上述只是我自己測試時發現的問題,供您參考。
我遇到跟一樓問的一樣,把runtime修改也一樣,verify同樣出現error,檢查heroku的log,看起來是App crashed! 但不清楚究竟為何?
2022-01-02T05:25:30.337244+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/callback" host=arbitage-profit-bot.herokuapp.com request_id=b27a52cf-eec3-4b53-9b1d-205e7a3e277e fwd="147.92.150.194" dyno= connect= service= status=503 bytes= protocol=https
2022-01-02T05:28:12.699233+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/callback" host=arbitage-profit-bot.herokuapp.com request_id=69673c97-e9b9-4a39-bf23-6e84199576f1 fwd="147.92.150.193" dyno= connect= service= status=503 bytes= protocol=https
您好,經測試應該跟Procfile
有關,請更正如下:
web: gunicorn app:app –preload
(!先前範例為web: gunicorn app_core:app –preload
,這會導致錯誤的結果,請再試試看,謝謝您)